package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.DishService;
import com.itheima.reggie.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 新增员工
 *      ·前端
 *          用户点击 新增菜品分类，新增菜单分类
 *          根据点击选项不同，传递不同参数
 *              根据参数设置type的值
 *          弹出新增用户表单
 *          用户输入完数据后
 *              点击保存，发送“add”
 *              调用submitForm方法
 *                  将表单数据进行封装
 *                  对输入name和sort进行第一次判断
 *                  设置正则表达式，对sort进行第二次判断
 *                  发送异步请求，携带表单数据
 *                  根据返回值判断是否添加成功
 *       ·后端
 *          接收用户传递的信息，调用保存方法，返回成功信息
 *
 *  查询分类
 *      ·前端
 *          页面初始化时，调用init方法
 *          发送同步请求，传递page，pageSize
 *          请求拦截，拼接到请求行
 *              http://localhost/category/page?page=1&pageSize=10
 *          根据后端返回的数据进行读取，赋值到页面表单
 *      ·后端
 *          接收请求参数
 *          创建分页构造器，传入page，pageSize
 *          创建条件构造器，设置根据修改时间进行倒序
 *          调用查询方法，返回查询结果
 *
 *  删除分类
 *      ·前端
 *          点击删除按钮，发送异步请求，携带id
 *              根据返回值进行判断
 *                  删除成功正常弹框
 *                  删除失败根据msg进行弹框
 *      ·后端
 *      方法一：
 *          接收传递的id
 *          分类表格对dish和setmeal两个表格有关联关系
 *              根据id在dish和setmeal表进行查询，是否有相关关联
 *                  创建dish和setmeal实体类
 *                  完善mapper和service层
 *                      @Select("select count(*) from dish where category_id = #{id}")
 *                      @Select("select count(*) from setmeal where category_id = #{id}")
 *              根据返回值进行返回错误语句
 *          调用删除方法，传入id，返回成功语句
 *      方法二：
 *          在CategoryService创建remove方法，参数为id
 *              创建条件构造器，对dish和setmeal的CategoryId 和 参数id 进行比较
 *              调用count方法，返回值>0则抛出自定义业务异常CustomException
 *                  CustomException异常继承RuntimeException运行异常
 *              在全局异常处理器加入CustomException处理，返回R.error，将msg返回前端
 *          调用remove方法，返回删除成功信息
 *
 *  修改用户信息
 *      ·前端
 *          用户点击编辑按钮，将action设置为edit，将row信息回显到表单，弹出修改页面
 *          点击提交，对表单数据进行检验，创建正则表达式，对sort进行二次检验
 *          发送异步请求，携带表单数据
 *          根据返回值进行信息展示
 *      ·后端
 *          接收发送的数据
 *          调用修改方法
 *          返回信息
 */

@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    private CategoryService service;


    /**
     * 新增员工
     * @param category
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){

        //调用添加方法
        service.save(category);

        //返回结果
        return R.success("新增成功");
    }

    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public R<Page> getAll(Long page,Long pageSize){

        //创建分页构造器
        Page<Category> pageInfo = new Page<>(page,pageSize);

        //创建条件构造器
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();
        lqw.orderByAsc(Category::getSort);

        //调用查询方法
        service.page(pageInfo,lqw);

        //返回查询到的信息
        return R.success(pageInfo);
    }

    /**
     * 删除数据
     * @param id
     * @return
     */
    @DeleteMapping
    public R<String> deleteById(Long id){

        //方法一：
        //查询分类里面是否有菜品存在
//        if (dishService.selectCountByCategoryId(id)){
//            return R.error("分类下有菜品存在，不能进行删除");
//        }

        //查询分类下是否有套餐存在
//        if (setmealService.selectCountByCategoryId(id)){
//            return R.error("分类下有套餐存在，不能进行删除");
//        }

        //调用删除方法
//        service.removeById(id);

        //方法二：
        //创建自定义remove方法，判断分类是否有关联信息
        service.remove(id);

        //返回删除信息
        return R.success("删除成功");
    }

    /**
     * 修改用户信息
     * @param category
     * @return
     */
    @PutMapping
    public R<String> updateById(@RequestBody Category category){

        //调用修改方法
        service.updateById(category);

        //返回结果
        return R.success("修改成功");
    }

    /**
     * 根据type查询数据
     * 菜品模块使用
     * @param type
     * @return
     */
    @GetMapping("/list")
    public R<List<Category>> getByType(int type){

        //创建条件构造器
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();

        //根据type进行筛选
        lqw.eq(Category::getType,type);
        //按照sort进行升序，updateTime进行降序
        lqw.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);


        //调用查询方法
        List<Category> list = service.list(lqw);

        //返回查询结果
        return R.success(list);
    }

}
